package pers.tz.题目.leetcode;

/**
 * @author irony
 * @date 2024-03-17
 */
public class leetcode_0125_验证回文串 {
//如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后，短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
//
// 字母和数字都属于字母数字字符。
//
// 给你一个字符串 s，如果它是 回文串 ，返回 true ；否则，返回 false 。
//
// 示例 1：
//输入: s = "A man, a plan, a canal: Panama"
//输出：true
//解释："amanaplanacanalpanama" 是回文串。
//
// 示例 2：
//输入：s = "race a car"
//输出：false
//解释："raceacar" 不是回文串。
//
// 示例 3：
//输入：s = " "
//输出：true
//解释：在移除非字母数字字符之后，s 是一个空字符串 "" 。
//由于空字符串正着反着读都一样，所以是回文串。
//
// 提示：
// 1 <= s.length <= 2 * 10⁵
// s 仅由可打印的 ASCII 字符组成

    public static void main(String[] args) {
        char startC = '0';
        char lastC = 'P';
        System.out.println(equal(startC, lastC));

        //        System.out.println(isPalindrome("A man, a plan, a canal: Panama"));
    }

    public static boolean equal(char c1, char c2) {
        if (isNumber(c1) || isNumber(c2)) {
            return c1 == c2;
        }
        // a  A   32
        // b  B   32
        // c  C   32
        return (c1 == c2) || (Math.max(c1, c2) - Math.min(c1, c2) == 32);
    }

    public static boolean isPalindrome(String s) {
        int start = 0;
        int last = s.length() - 1;

        while (start < last) {
            char startC = s.charAt(start);
            char lastC = s.charAt(last);
            if (isLegit(startC) && isLegit(lastC)) {
                if (isNumber(startC) || isNumber(lastC)) {
                    if (startC != lastC) {
                        return false;
                    }
                } else {
                    if (startC != lastC) {
                        if (Math.max(startC, lastC) - Math.min(startC, lastC) != 32) {
                            return false;
                        }
                    }
                }

                start++;
                last--;
            } else  {
                if (!isLegit(startC)) {
                    start++;
                } else {
                    last--;
                }
            }

        }

        return true;
    }

    private static boolean isLegit(char c) {
        return isNumber(c) || isLegitChar(c);
    }

    private static boolean isNumber(char c) {
        return c >= '0' && c <= '9';
    }

    private static boolean isLegitChar(char c) {
        return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
    }
}
